Systems Manager ステートマネージャーでコマンドをスケジュール実行してみた
こんにちは、望月です。
皆さんは crontab -r
したことはありますか?私はあります。
ご存じの通り crontab
コマンドは cron のスケジュール設定を行うためのコマンドですが変更コマンドが crontab -e
で、削除コマンドが crontab -r
とキーが隣り合わせのため、変更の際にうっかり削除してしまう (削除するかどうかの確認も入らない) というオペミスの話が古来よりあり、人々を苦しめてきました。
よくある回避方法としては crontab -i
オプションを付けると削除時に確認が入るようになるため alias crontab="crontab -i"
という形でエイリアス設定をすることでうっかり削除を防ぐことができます。
しかし、そもそも crontab
を使わずにスケジュール管理し指定したコマンドを実行できればいいのでは?Systems Manager ステートマネージャーが使えないかと思ったのでやってみました。
まとめ
最初にまとめを書きますが Cron 式の注意点がいろいろとあるため crontab
コマンド ( crond
) を使わなくて済むという選択肢は難しいかもしれません。
注意点を認識した上で使える場合は使っていきましょう。
気になる注意点が以下となり、AWS で管理するということで 30 分未満の間隔で設定をすることができません。 また、時刻が UTC 形式となるため、スケジュールの設定時には注意が必要です。
関連付けは、1/2、1、2、4、8、または 12 時間ごと、毎日、毎週、n 日ごと、またはその月の最後の x 曜日などの特定の時間の cron 式をサポートしています。
リファレンス: Systems Manager の Cron 式および rate 式 - AWS Systems Manager
やってみた
AWS CLI を利用し設定してみました。ここでは 30 分ごとにコマンド実行するよう設定を入れています。
aws ssm create-association \ --region ap-northeast-1 \ --name AWS-RunShellScript \ --association-name crontab-temp \ --targets Key=tag:Env,Values=cron \ --schedule-expression 'cron(0 */30 * * * ? *)' \ --parameters "commands='id', 'env'"
オプションの内容については以下を確認してください。
--region
- 東京リージョンを指定しています
--name
- 実行するドキュメントを指定します。ここでは
AWS-RunShellScript
を指定しています
- 実行するドキュメントを指定します。ここでは
--association-name
- ステートマネージャーの関連付けの名前を指定します。ここでは例として
crontab-temp
を指定します
- ステートマネージャーの関連付けの名前を指定します。ここでは例として
--targets
- 実行するインスタンスのタグを指定しています。タグ以外も指定できますがここでは Key: Env, Value: cron で設定しています
--schedule-expression
- cron 式でスケジュールを指定しています。時刻は UTC 形式になるので注意してください。また、若干書式が crontab と異なる部分もあるため、詳しくは以下ドキュメントを確認してください
--parameters
- 実行するコマンドを記載します。カンマで区切ることで複数コマンドを実行することが出来ます